#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>

void * thread_function(void * arg);
sem_t bin_sem;

#define WORK_SIZE 1024
char work_area[WORK_SIZE];

int main()
{
    int res;
    pthread_t a_thread;
    void * thread_result;

    strcpy(work_area," ");//复制是，需要是一个空字符串。估计是要'\0'字符。
//    work_area[0]  = '\0'; //不行 

    res = sem_init(&bin_sem,0,0);
    if (res != 0){
        perror("Semaphore initialization failed");
        exit(EXIT_FAILURE);
    }

    res = pthread_create(&a_thread,NULL,thread_function,NULL);
    if (res != 0){
        perror("Thread creation failed");
        exit(EXIT_FAILURE);
    }
    printf("input some text,Enter 'end' to finish\n");
    while(strncmp("end",work_area,3) != 0){
        fgets(work_area,WORK_SIZE,stdin);
        sem_post(&bin_sem);
    }

    printf("\nWaiting for thread to finish\n");
    res = pthread_join(a_thread,&thread_result);
    if (res != 0){
        perror("pthread_join call failed");
        exit(EXIT_FAILURE);
    }
    printf ("Thread Terminated\n");
    sem_destroy(&bin_sem);
    exit(EXIT_SUCCESS);

}
/**
 *主线程用于数据的接收，子线程用于判断数据的长度。
 程序执行现由子线程在执行sem_wait函数堵塞，在主线程的sem_post+1解开堵塞。
 * */
void * thread_function(void * arg)
{
    sem_wait(&bin_sem);
    while(strncmp("end",work_area,3) != 0){
        printf("You input %zu characters\n",(strlen(work_area) -1));
        sem_wait(&bin_sem);
    }

    pthread_exit(NULL);
}
